<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>数组更新检测</title>
    <script src="./vue.js"></script>
</head>

<body>
    <!-- 数组的变异方法会触发视图的更新：
    包括：push(),pop(),unshift(),shift(),splice(),sort(),reverse()
    变异方法：会改变原数组内容
    数组的非变异方法：不会改变原始数组内容，而是返回一个新的数组：
    eg:filter(),concat(),slice() -->
    <div id="app">
        <ul>
            <li v-for="(item, index) in items">
                {{ items.length }} : {{ a }} : {{ item }}
            </li>
        </ul>
        <ul>
            <li v-for="(value, name, index) in person">
                {{ index }} : {{ name }} : {{ value }}
            </li>
        </ul>
    </div>

    <script>
        var app = new Vue({
            el: "#app",
            data: {
                a: 1,
                items: [1, 2, 3, 4, 5],
                person: {
                    name: "Aspirate Qiu",
                    sex: "M",
                    age: 23
                }
            }
        });
        // 当使用新数组替换旧数组时，vue为使dom元素得到最大范围的重用而实现了智能启发式方法（高效）
        app.items = app.items.filter(function (item) {
            // 返回符合条件的item
            return item % 2 === 0;
        });

        // 注意事项：由于JavaScript的限制，vue不能检测以下情况数组的变动
        // (在控制台下，即页面载入之后是不会随之响应的,在代码载入之前会)
        // 1，使用索引直接设置一个数组项：
        app.items[0] = "新的值";
        // 解决方法：使用Vue.set、app.$set、Array.prototype.splice
        Vue.set(app.items, 0, "使用Vue.set解决");
        app.$set(app.items, 1, "使用vm.$set解决");
        app.items.splice(2, 1, "使用splice方法解决");
        // 2，修改数组的长度：
        app.items.length = 10;
        // 解决方法：
        app.items.splice(5);

        // 由于JavaScript的限制，vue不能检测对象属性的添加/删除
        // (在控制台下，即页面载入之后是不会随之响应的,在代码载入之前会)
        // 1，对于已经创建的实例，不能 动态添加 根级别 的响应式属性
        app.a = 3; // 可以
        app.b = 2; // 不能
        // 解决方法：
        // 添加一个属性：使用Vue.set(obj, propertyName, value)向嵌套对象添加响应式属性
        Vue.set(app.person, "address", "none");
        app.$set(app.person, "id", "000");
        // 2，为已有对象添加多个新属性：
        Object.assign(app.person, {
            "a": "a",
            "b": "b"
        });     // 不能
        app.person = Object.assign({}, app.person, {
            "ok": "ko",
            "ko": "ok"
        });     // 可以
    </script>
</body>

</html>